home *** CD-ROM | disk | FTP | other *** search
/ Saar AMOK 2 / Saar AMOK II - Oktober 1994 (1994)(Kreativ Marketing)(DE)[!][I-7598].iso / disks / 651_700 / 652 / xpkdisk / source.lha / device1.a next >
Text File  |  1993-11-08  |  4KB  |  209 lines

  1. ; DEVICE1.A
  2. ; $Id: device1.a,v 1.3 1993/11/08 13:11:15 Rhialto Rel $
  3. ; $Log: device1.a,v $
  4. ; Revision 1.3  1993/11/08  13:11:15  Rhialto
  5. ; Add RCS tags.
  6. ;
  7.         include    "c.i"
  8. ;;;;
  9. ;
  10. ;   Some constants that need to be modified on specific versions
  11.  
  12. RTPRI        equ     0
  13.  
  14. ;;;;
  15. ;
  16. ; The first executable location. This should return an error in case
  17. ; someone tried to run you as a program (instead of loading you as a
  18. ; device)
  19.  
  20.     section text,code
  21.  
  22.     moveq.l #20,d0
  23.     rts
  24.  
  25. ;;;;
  26. ;
  27. ; A romtag structure. Both "exec" and "ramlib" look for this structure to
  28. ; discover magic constants about you (such as where to start running you
  29. ; from...).
  30. ;
  31.     xref    _DevName
  32.     xref    _idString
  33.     xdef    _RomTag
  34. _RomTag:
  35.     dc.w    RTC_MATCHWORD
  36.     dc.l    _RomTag     ; rt_MatchTag
  37.     dc.l    EndCode     ; rt_EndSkip
  38.     dc.b    RTF_AUTOINIT    ; rt_Flags
  39.     dc.b    VERSION     ; rt_Version
  40.     dc.b    NT_DEVICE    ; rt_Type
  41.     dc.b    RTPRI        ; rt_Pri
  42.     dc.l    _DevName    ; rt_Name
  43.     dc.l    _idString    ; rt_IdString
  44.     dc.l    Init        ; rt_Init
  45.  
  46.     xref    _InitTable
  47.     xref    @Init
  48. Init:
  49.     dc.l    xd_SIZEOF    ; size of data portion of Device
  50.     dc.l    LibVectors    ; pointer to function initialisers
  51.     dc.l    InitTable    ; pointer to data initialisers
  52.     dc.l    @Init        ; routine to run (d0: dev ptr, a0: seglist)
  53.  
  54.     xref     @DevOpen,@DevClose,@DevExpunge
  55.     xref     @DevBeginIO
  56.     xref     @DevAbortIO
  57. LibVectors:
  58.     dc.l    @DevOpen,@DevClose,@DevExpunge,LibNull
  59.     dc.l    @DevBeginIO
  60.     dc.l    @DevAbortIO
  61.     dc.l    -1
  62.  
  63. INITBYTE    MACRO    ; &offset,&value
  64.         IFLE    (\1)-255        ;If offset <=255
  65.         DC.B    $a0,\1        ;use byte offset
  66.         DC.B    \2,0
  67.         MEXIT            ;exit early
  68.         ENDC
  69.         DC.B    $e0,0
  70.         DC.W    \1
  71.         DC.B    \2,0
  72.         ENDM
  73.  
  74. INITWORD    MACRO    ; &offset,&value
  75.         IFLE    (\1)-255        ;If offset <=255
  76.         DC.B    $90,\1        ;use byte offset
  77.         DC.W    \2
  78.         MEXIT            ;exit early
  79.         ENDC
  80.         DC.B    $d0,0
  81.         DC.W    \1
  82.         DC.W    \2
  83.         ENDM
  84.  
  85. INITLONG    MACRO    ; &offset,&value
  86.         IFLE    (\1)-255        ;If offset <=255
  87.         DC.B    $80,\1        ;use byte offset
  88.         DC.L    \2
  89.         MEXIT            ;exit early
  90.         ENDC
  91.         DC.B    $c0,0
  92.         DC.W    \1
  93.         DC.L    \2
  94.         ENDM
  95.  
  96. InitTable:
  97.     INITBYTE ln_Type,NT_DEVICE
  98.     INITLONG ln_Name,_DevName
  99.     INITBYTE dev_Flags,LIBF_CHANGED!LIBF_SUMUSED,
  100.     INITWORD dev_Version,VERSION
  101.     INITWORD dev_Revision,REVISION
  102.     INITLONG dev_IdString,_idString
  103.     dc.w    0
  104.  
  105. ;;;;
  106. ;
  107. ; Here begin the system interface commands. When the user calls
  108. ; OpenDevice/CloseDevice/RemDevice, this eventually gets trahslated into
  109. ; a call to the following routines (Open/Close/Expunge).  Exec has
  110. ; already put our device pointer in A6 for us.    Exec has turned off task
  111. ; switching while in these routines (via Forbid/Permit), so we should not
  112. ; take too long in them.
  113. ;
  114. ; These glue routines are not necessary when using the special
  115. ; __D0 keywords of DICE. When we do use these, don't forget to make sure
  116. ; the C routines expect the arguments on the stack (i.e. __stkargs)
  117.  
  118.     ifne    0
  119.     xdef    Init
  120.     xref    _Init
  121. Init:                ;a0=segment list
  122.     move.l    A0,-(sp)
  123.     jsr    _Init
  124.     addq    #4,sp
  125.     rts
  126.  
  127.     xdef    DevOpen
  128.     xref    _DevOpen
  129. DevOpen:            ;d0=unitnum,d1=flags,a1=ioreq,a6=device
  130.     movem.l D0-D1/A1/A6,-(sp)
  131.     jsr    _DevOpen
  132.     lea    16(sp),sp
  133.     rts
  134.  
  135.     xdef    DevClose
  136.     xref    _DevClose
  137. DevClose:            ;a1=ioreq,a6=device
  138.     movem.l A1/A6,-(sp)
  139.     jsr    _DevClose
  140.     addq    #8,sp
  141.     rts
  142.  
  143.     xdef    DevExpunge
  144.     xref    _DevExpunge
  145. DevExpunge:            ;a6=device
  146.     movem.l A6,-(sp)
  147.     jsr    _DevExpunge
  148.     addq    #4,sp
  149.     rts
  150.  
  151.     xdef    DevBeginIO
  152.     xref    _DevBeginIO
  153. DevBeginIO:            ;a1=ioreq,a6=device
  154.     movem.l A1/A6,-(sp)
  155.     jsr    _DevBeginIO
  156.     addq    #8,sp
  157.     rts
  158.  
  159.     xdef    DevAbortIO
  160.     xref    _DevAbortIO
  161. DevAbortIO:            ;a1=ioreq,a6=device
  162.     movem.l A1/A6,-(sp)
  163.     jsr    _DevAbortIO
  164.     addq    #8,sp
  165.     rts
  166.     endc
  167.  
  168. LibNull:
  169.     clr.l    d0
  170.     rts
  171.  
  172.  
  173. ;;;;
  174. ;
  175.     xdef    @UnitSeglist,_UnitSeglist
  176.     xref    @UnitTask,_UnitTask
  177.     ds.l    0
  178.     nop            ; fake segment length
  179.     nop
  180. @UnitSeglist:
  181. _UnitSeglist:
  182.     nop            ; pointer to next segment
  183.     nop
  184.     nop            ; extra padding just in case
  185.     nop
  186.     jmp    _UnitTask(pc)
  187.  
  188.     ifne    HANDLE_IO_QUICK
  189. ;;;;
  190. ;
  191. ;   C interface to the atomic set bit and test old value instruction.
  192. ;
  193. ;   Called as    BSET_ACTIVE(byte *address).
  194. ;
  195. ;   Old value of the bit returned all over d0.w
  196.  
  197.     xdef    _BSET_ACTIVE
  198.     xdef    @BSET_ACTIVE
  199. _BSET_ACTIVE:
  200.     move.l    4(sp),a0
  201. @BSET_ACTIVE:
  202.     bset    #UNITB_ACTIVE,(a0)         ; 0 UNITB_ACTIVE
  203.     sne    d0
  204.     rts
  205.     endc    ; HANDLE_IO_QUICK
  206.  
  207. EndCode
  208.     end
  209.